package demo02;

import java.util.HashMap;
import java.util.Map.Entry;

/*
 *  HashMap存储自定义类型键值对
 *  Map集合保证key是唯一的：
 *      作为key的元素，必须重写hashCode方法和equals方法，以保证key唯一
 */
public class Demo01HashMapSavePerson {
    public static void main(String[] args) {
        demo01();
        demo02();
    }

    /*
     *  HashMap存储自定义类型键值对
     *  key：Person类型（同名同年龄的视为同一个人）
     *      Person类必须重写hashCode方法和equals方法，以保证key唯一
     *  value：String类型
     *      value可以重复
     */
    private static void demo02() {
        HashMap<Person, String> hashMap = new HashMap<>();
        hashMap.put(new Person("西高地", 20), "土司鸡");
        hashMap.put(new Person("土狗", 22), "老虎");
        hashMap.put(new Person("巴哥", 18), "波奇");
        hashMap.put(new Person("西高地", 20), "粹花");

        for (Person perosn : hashMap.keySet()) { // 使用增强for和键找值遍历集合
            // 自定义的Person类重写了hashCode和equals方法，保证了集合同名同年龄的键对象唯一，不会重复
            System.out.println(perosn + "=" + hashMap.get(perosn)); // Perosn [age=20, name=西高地]=粹花 ...
        }
    }

    /*
     *  HashMap存储自定义类型键值对
     *  key：String类型
     *      String类重写了hashCode方法和equals方法，可以保证key唯一
     *  value：Person类型
     *      value可以重复
     */
    private static void demo01() {
        HashMap<String, Person> hashMap = new HashMap<>();
        hashMap.put("西高地", new Person("土司鸡", 18));
        hashMap.put("土狗", new Person("老虎", 20));
        hashMap.put("边牧", new Person("哈利", 16));
        hashMap.put("西高地", new Person("粹花", 1)); // 存入时键与原有的键相同，因此替换了该键原来的值

        for (Entry<String, Person> mEntry : hashMap.entrySet()) { // 使用增强for和entrySet遍历集合
            System.out.println(mEntry.getKey() + "=" + mEntry.getValue()); // 西高地=Perosn [age=1, name=粹花] ...
        }
    }
}